CROSS_COMPILE	?= 
TARGET 			?= main

CC 				:= $(CROSS_COMPILE)gcc
C++				:= $(CROSS_COMPILE)g++
LD 				:= $(CROSS_COMPILE)ld
OBJCOPY 		:= $(CROSS_COMPILE)objcopy
OBJDUMP 		:= $(CROSS_COMPILE)objdump

# 头文件 .h 路径
INCDIRS := $(shell ./getdir.sh)

# 源文件.S .cpp 路径
SRCDIRS := $(shell ./getdir.sh)

# 每个路径前加一个 -I
INCLUDE			:= $(patsubst %, -I %, $(INCDIRS))

# 找到SRCDIRS所有路径下的.S文件 包含路径名
SFILES			:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
# 找到SRCDIRS所有路径下的.c文件 包含路径名
CFILES			:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))
# 找到SRCDIRS所有路径下的.cpp文件 包含路径名
CPPFILES		:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.cpp))

# 去除路径明的 .S 文件
SFILENDIR		:= $(notdir $(SFILES))
# 去掉路径名的 .c 文件
CFILENDIR		:= $(notdir $(CFILES))
# 去掉路径名的 .cpp 文件
CPPFILENDIR		:= $(notdir $(CPPFILES))

# 将所有的 .S 换成.o 并在前面加上obj/
SOBJS			:= $(patsubst %, obj/%, $(SFILENDIR:.S=.o))
# 将所有的 .c 换成.o 并在前面加上obj/
COBJS			:= $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
# 将所有的 .cpp 换成.o 并在前面加上obj/
CPPOBJS			:= $(patsubst %, obj/%, $(CPPFILENDIR:.cpp=.o))
# .o 文件集合
OBJS			:= $(SOBJS) $(COBJS) $(CPPOBJS)
# 自定义make查找路径 即所有的源文件路径
VPATH			:= $(SRCDIRS)


$(TARGET) : $(OBJS)
	$(C++) -o $@ $^ -lpthread

# 依赖文件为 obj/start.o形式的文件转换成start.S
$(SOBJS) : obj/%.o : %.S
	$(C++) -c $(INCLUDE) -o $@ $< -lpthread

# 依赖文件为 obj/key.o形式的文件转换成key.c
$(COBJS) : obj/%.o : %.cpp
	$(C++) -c $(INCLUDE) -o $@ $< -lpthread

# 依赖文件为 obj/key.o形式的文件转换成key.cpp
$(CPPOBJS) : obj/%.o : %.cpp
	$(C++) -c $(INCLUDE) -o $@ $<

# 声明伪目标
.PHONY:clean
# 命令前面加 -表示命令执行出错忽略继续执行 
clean:
	-rm -rf *.o $(TARGET) $(TARGET) $(TARGET) $(COBJS) $(CPPOBJS) $(SOBJS)
